package org.javahispano.javacup.tacticas_aceptadas.Raydelto;

import java.awt.Color;
import java.util.LinkedList;
import java.util.List;

import org.javahispano.javacup.modelo.Comando;
import org.javahispano.javacup.modelo.ComandoGolpearBalon;
import org.javahispano.javacup.modelo.ComandoIrA;
import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.EstiloUniforme;
import org.javahispano.javacup.modelo.JugadorDetalle;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;
import org.javahispano.javacup.modelo.Tactica;
import org.javahispano.javacup.modelo.TacticaDetalle;

public class TacticaItla implements Tactica {
	LinkedList<Comando> comandos = new LinkedList<Comando>();
	
    Posicion alineacion1[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(-18.06993006993007,-29.93212669683258),
            new Posicion(-2.6153846153846154,-28.98190045248869),
            new Posicion(14.027972027972028,-28.50678733031674),
            new Posicion(7.132867132867133,-14.015837104072398),
            new Posicion(-11.174825174825173,-14.490950226244346),
            new Posicion(-30.909090909090907,-2.1380090497737556),
            new Posicion(26.153846153846157,-2.8506787330316743),
            new Posicion(-12.601398601398602,19.479638009049776),
            new Posicion(-1.188811188811189,3.088235294117647),
            new Posicion(6.181818181818182,28.744343891402718)
        };

        Posicion alineacion2[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(-12.839160839160838,-24.943438914027148),
            new Posicion(7.846153846153847,-25.18099547511312),
            new Posicion(-0.951048951048951,-31.83257918552036),
            new Posicion(-3.3286713286713288,-12.59049773755656),
            new Posicion(-12.125874125874127,5.701357466063349),
            new Posicion(-31.384615384615387,0.9502262443438915),
            new Posicion(23.3006993006993,1.6628959276018098),
            new Posicion(-11.174825174825173,25.656108597285066),
            new Posicion(5.230769230769231,14.96606334841629),
            new Posicion(5.944055944055944,34.44570135746606)
        };

        Posicion alineacion3[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(-13.076923076923078,-31.357466063348415),
            new Posicion(0.951048951048951,-30.407239819004527),
            new Posicion(12.601398601398602,-31.59502262443439),
            new Posicion(-6.895104895104895,-20.667420814479637),
            new Posicion(5.230769230769231,-20.667420814479637),
            new Posicion(-22.58741258741259,-11.877828054298643),
            new Posicion(19.020979020979023,-9.97737556561086),
            new Posicion(-11.412587412587413,10.214932126696834),
            new Posicion(-2.8531468531468533,-4.98868778280543),
            new Posicion(7.37062937062937,14.728506787330318)
        };

        Posicion alineacion4[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(-10.223776223776223,-31.357466063348415),
            new Posicion(10.223776223776223,-31.119909502262445),
            new Posicion(26.391608391608393,-23.518099547511312),
            new Posicion(-22.825174825174827,-23.755656108597286),
            new Posicion(-2.8531468531468533,-17.34162895927602),
            new Posicion(25.202797202797203,0.47511312217194573),
            new Posicion(-27.34265734265734,-0.7126696832579186),
            new Posicion(-10.937062937062937,14.490950226244346),
            new Posicion(-1.188811188811189,-1.1877828054298643),
            new Posicion(4.041958041958042,23.28054298642534)
        };

        Posicion alineacion5[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(-3.090909090909091,-23.755656108597286),
            new Posicion(6.6573426573426575,-23.042986425339365),
            new Posicion(-12.839160839160838,-23.042986425339365),
            new Posicion(-28.055944055944057,-9.739819004524888),
            new Posicion(23.538461538461537,-9.264705882352942),
            new Posicion(-23.3006993006993,14.25339366515837),
            new Posicion(-14.503496503496503,-8.552036199095022),
            new Posicion(-0.4755244755244755,12.352941176470589),
            new Posicion(5.468531468531468,-4.038461538461538),
            new Posicion(15.692307692307693,16.866515837104075)
        };

        Posicion alineacion6[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(-11.412587412587413,-30.16968325791855),
            new Posicion(8.797202797202797,-30.88235294117647),
            new Posicion(20.685314685314687,-20.429864253393667),
            new Posicion(8.321678321678322,-19.004524886877828),
            new Posicion(-5.706293706293707,-17.57918552036199),
            new Posicion(-17.389312977099234,-19.58955223880597),
            new Posicion(-23.618320610687025,-0.7835820895522387),
            new Posicion(-1.4265734265734267,16.628959276018097),
            new Posicion(-1.6643356643356644,-3.088235294117647),
            new Posicion(22.580152671755727,-1.3059701492537314)
        };

        Posicion alineacion7[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(-7.132867132867133,-30.407239819004527),
            new Posicion(4.755244755244756,-26.84389140271493),
            new Posicion(-5.468531468531468,-17.816742081447966),
            new Posicion(11.888111888111888,-1.900452488687783),
            new Posicion(-12.125874125874127,-0.23755656108597287),
            new Posicion(16.167832167832167,17.104072398190045),
            new Posicion(-13.79020979020979,20.192307692307693),
            new Posicion(-4.041958041958042,33.02036199095023),
            new Posicion(-1.902097902097902,13.303167420814479),
            new Posicion(6.419580419580419,27.556561085972852)
        };

        Posicion alineacion8[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(-7.132867132867133,-30.407239819004527),
            new Posicion(4.755244755244756,-26.84389140271493),
            new Posicion(-5.468531468531468,-17.816742081447966),
            new Posicion(11.888111888111888,-1.900452488687783),
            new Posicion(-12.125874125874127,-0.23755656108597287),
            new Posicion(16.167832167832167,17.104072398190045),
            new Posicion(-13.79020979020979,20.192307692307693),
            new Posicion(-4.041958041958042,33.02036199095023),
            new Posicion(-1.902097902097902,13.303167420814479),
            new Posicion(6.419580419580419,27.556561085972852)
        };

        Posicion alineacion9[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(-1.902097902097902,-35.39592760180996),
            new Posicion(3.804195804195804,-31.357466063348415),
            new Posicion(-10.6993006993007,-31.59502262443439),
            new Posicion(10.937062937062937,-24.943438914027148),
            new Posicion(-21.16083916083916,-21.61764705882353),
            new Posicion(6.6573426573426575,-10.927601809954751),
            new Posicion(-4.041958041958042,-23.993212669683256),
            new Posicion(-4.041958041958042,-4.751131221719457),
            new Posicion(-11.888111888111888,-11.64027149321267),
            new Posicion(-4.5174825174825175,10.214932126696834)
        };

        Posicion alineacion10[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(-9.034965034965035,-27.556561085972852),
            new Posicion(4.755244755244756,-28.031674208144796),
            new Posicion(-21.3986013986014,-30.16968325791855),
            new Posicion(17.594405594405593,-27.794117647058822),
            new Posicion(-2.13986013986014,-13.303167420814479),
            new Posicion(11.888111888111888,-2.3755656108597285),
            new Posicion(-19.25874125874126,-0.23755656108597287),
            new Posicion(-14.74125874125874,29.457013574660635),
            new Posicion(-1.902097902097902,13.303167420814479),
            new Posicion(9.510489510489512,29.21945701357466)
        };

        class TacticaDetalleImpl implements TacticaDetalle {

            public String getNombre() {
                return "Atletico ITLA";
            }

            public String getPais() {
                return "Republica Dominicana";
            }

            public String getEntrenador() {
                return "Ruben Tascon";
            }

            public Color getColorCamiseta() {
                return new Color(0, 0, 204);
            }

            public Color getColorPantalon() {
                return new Color(56, 184, 167);
            }

            public Color getColorFranja() {
                return new Color(255, 255, 255);
            }

            public Color getColorCalcetas() {
                return new Color(44, 117, 112);
            }

            public Color getColorPortero() {
                return new Color(160, 182, 51        );
            }

            public EstiloUniforme getEstilo() {
                return EstiloUniforme.FRANJA_VERTICAL;
            }

            public Color getColorCamiseta2() {
                return new Color(1, 240, 218);
            }

            public Color getColorPantalon2() {
                return new Color(74, 35, 203);
            }

            public Color getColorFranja2() {
                return new Color(160, 158, 106);
            }

            public Color getColorCalcetas2() {
                return new Color(164, 87, 56);
            }

            public Color getColorPortero2() {
                return new Color(134, 227, 103        );
            }

            public EstiloUniforme getEstilo2() {
                return EstiloUniforme.FRANJA_DIAGONAL;
            }

            class JugadorImpl implements JugadorDetalle {

                String nombre;
                int numero;
                Color piel, pelo;
                double velocidad, remate, presicion;
                boolean portero;
                Posicion posicion;

                public JugadorImpl(String nombre, int numero, Color piel, Color pelo,
                        double velocidad, double remate, double presicion, boolean portero) {
                    this.nombre=nombre;
                    this.numero=numero;
                    this.piel=piel;
                    this.pelo=pelo;
                    this.velocidad=velocidad;
                    this.remate=remate;
                    this.presicion=presicion;
                    this.portero=portero;
                }

                public String getNombre() {
                    return nombre;
                }

                public Color getColorPiel() {
                    return piel;
                }

                public Color getColorPelo() {
                    return pelo;
                }

                public int getNumero() {
                    return numero;
                }

                public boolean esPortero() {
                    return portero;
                }

                public double getVelocidad() {
                    return velocidad;
                }

                public double getRemate() {
                    return remate;
                }

                public double getPresicion() {
                    return presicion;
                }

            }

            public JugadorDetalle[] getJugadores() {
                return new JugadorDetalle[]{
                    new JugadorImpl("Stalin", 1, new Color(255,200,150), new Color(50,0,0),0.71d,0.47d,1.0d, true),
                    new JugadorImpl("Winckler", 2, new Color(255,200,150), new Color(50,0,0),0.54d,0.5d,0.5d, false),
                    new JugadorImpl("Raydelto", 3, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false),
                    new JugadorImpl("Darien", 4, new Color(255,200,150), new Color(50,0,0),0.76d,0.5d,0.77d, false),
                    new JugadorImpl("Willis", 5, new Color(255,200,150), new Color(50,0,0),1.0d,0.5d,1.0d, false),
                    new JugadorImpl("Luis", 6, new Color(255,200,150), new Color(50,0,0),0.81d,0.5d,0.62d, false),
                    new JugadorImpl("Amadis", 7, new Color(255,200,150), new Color(50,0,0),0.82d,0.75d,0.75d, false),
                    new JugadorImpl("Simeon", 8, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false),
                    new JugadorImpl("Leandro", 9, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false),
                    new JugadorImpl("Pedro", 10, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false),
                    new JugadorImpl("Ruben", 11, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false)
                };
            }
        }

        TacticaDetalle detalle=new TacticaDetalleImpl();
        public TacticaDetalle getDetalle() {
            return detalle;
        }

        public Posicion[] getPosicionSaca(SituacionPartido sp) {
        	if (sp.golesPropios() <= sp.golesRival()){
        		return alineacion7;
        	}else{
        		return alineacion2;	
        	}        	
        }

        public Posicion[] getPosicionRecive(SituacionPartido sp) {
        	if (sp.golesPropios() <= sp.golesRival()){
        		return alineacion9;
        	}else{
        		return alineacion6;	
        	}        	
        }

    public List<Comando> ejecutar(SituacionPartido sp) {
        //vacia la lista de comandos
    	comandos.clear();
        
        //Si el rival tiene una ventaja considerale
        if (sp.golesRival() - sp.golesPropios() > 3) {
            //cada jugador ubicarse segun alineacion 4
            for (int i = 0; i < 11; i++) {
                comandos.add(new ComandoIrA(i, alineacion4[i]));
            }        	        	
        }else if (sp.golesPropios() <= sp.golesRival()) {
            //cada jugador ubicarse segun alineacion 3
            for (int i = 0; i < 11; i++) {
                comandos.add(new ComandoIrA(i, alineacion3[i]));
            }
        } else {//sino, osea que voy ganando
            //cada jugador ubicarse segun alineacion 1
            for (int i = 0; i < 11; i++) {
                comandos.add(new ComandoIrA(i, alineacion1[i]));
            }
        }
        //obtiene el indice del jugador mas cercano al balon

        int indMasCercano = sp.balon().indiceMasCercano(sp.misJugadores());
        //el jugador mas cercano sigue al balon
        comandos.add(new ComandoIrA(indMasCercano, sp.balon()));
        //obtiene un arreglo con los indices de los jugadores que pueden rematar
        int rematan[] = sp.puedenRematar();
        //recorre los jugadores que pueden rematar
        for (int i : rematan) {
            //obtiene los jugadores mas cercanos, al jugador que puede rematar
            int[] cercanos = sp.misJugadores()[i].indicesMasCercanos(sp.misJugadores());
            //encontro un pase en falso
            boolean pase = false;
            boolean alto = false;
            //recorre los jugadores desde el mas lejano al mas cercano
            for (int j = 1; !pase && j < cercanos.length; j++) {
                //si el jugador es distinto al jugador que remata y el jugador esta mas adelantado
                if (sp.misJugadores()[i].getY() < sp.misJugadores()[cercanos[j]].getY()) {
                    //dar pase al jugador mas cercano que este en posicion mas ofensiva
                	double fuerza = 0.8;
                    if (sp.misJugadores()[i].distancia(sp.misJugadores()[cercanos[j]]) > 17) {
                        alto = true;
                    } else {
                    	fuerza = 0.6;
                        alto = false;
                    }
                    comandos.add(new ComandoGolpearBalon(i, sp.misJugadores()[cercanos[j]], fuerza + Math.random() * (1-fuerza), alto));
                    //encontro un pase por lo menos
                    pase = true;
                }
            }
            //si no encontro ningun pase
            if (!pase) {
                //Acerca el bal�n lo m�s posible al arco
            	comandos.add(new ComandoGolpearBalon(i, Constantes.centroArcoSup, .8 + Math.random() * .2, true));
            }
           
            if (sp.misJugadores()[i].distancia(Constantes.centroArcoSup) < 18) {
                comandos.add(new ComandoGolpearBalon(i, Constantes.centroArcoSup, .7 + Math.random() * .3, false));
            }else if (sp.misJugadores()[i].distancia(Constantes.centroArcoSup) < 28) {
                comandos.add(new ComandoGolpearBalon(i, Constantes.centroArcoSup, .8 + Math.random() * .2, true));
            }else if(sp.misJugadores()[i].distancia(Constantes.centroArcoSup) < 35){
            	comandos.add(new ComandoGolpearBalon(i, Constantes.centroArcoSup, 1, true));
            }
        }
        //retorna la lista de comandos.
        return comandos;
    }
}